from numpy import (
    zeros,  # 创建全零数组
    matmul,  # 矩阵乘法
    log2,  # 计算以2为底的对数
)


def calc_sum_rate_no_iui(
        channel_state,  # 信道状态信息矩阵，大小为 (用户数量, 天线数量)
        w_precoder,  # 预编码矩阵，大小为 (天线数量, 用户数量)
        noise_power_watt  # 噪声功率，单位为瓦特
) -> float:
    """
    计算在没有干扰用户干扰（IUI）的情况下的系统总速率。

    参数:
    - channel_state: 信道状态信息矩阵，表示每个用户与卫星之间的信道信息
    - w_precoder: 预编码矩阵，表示将信号预编码以提高信号质量
    - noise_power_watt: 噪声功率，单位为瓦特

    返回:
    - float: 在没有干扰用户干扰的情况下的系统总速率
    """

    user_nr = channel_state.shape[0]  # 用户数量

    # 初始化信噪比数组
    sinr_users = zeros(user_nr)

    for user_id in range(user_nr):
        # 提取第 user_id 个用户的信道向量
        H_k = channel_state[user_id, :]

        # 计算信号功率 (sigma_x) 为信道向量与预编码向量的乘积的平方模
        sigma_x = abs(matmul(H_k, w_precoder[:, user_id]))**2
        # 计算干扰功率 (sigma_int)，在这里没有用户间干扰，设为0
        sigma_int = 0

        # 计算用户的信噪比 (SINR)，并存储在 sinr_users 数组中
        sinr_users[user_id] = sigma_x / (noise_power_watt + sigma_int)

    # 初始化信息速率数组
    info_rate = zeros(user_nr)

    for user_id in range(user_nr):
        # 计算用户的信息速率，使用 Shannon 公式: R = log2(1 + SINR)
        info_rate[user_id] = log2(1 + sinr_users[user_id])

    # 计算系统总速率 (sum_rate_without_iui)，所有用户的信息速率的平均值
    sum_rate_without_iui = 1 / user_nr * sum(info_rate)

    return sum_rate_without_iui
